﻿using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;

namespace Magic.FlowCenter.Entity;

/// <summary>
/// 流程连线
/// </summary>
public class FlowLine
{
    /// <summary>
    /// 线Id
    /// </summary>
    public string id { get; set; }
    /// <summary>
    /// 显示
    /// </summary>
    public string label { get; set; }
    /// <summary>
    /// 类型
    /// </summary>
    public string type { get; set; }
    /// <summary>
    /// 源头节点
    /// </summary>
    public string sourceId { get; set; }
    /// <summary>
    /// 目标节点
    /// </summary>
    public string targetId { get; set; }
    /// <summary>
    /// 名称
    /// </summary>
    public string name { get; set; }
    /// <summary>
    /// 连接样式
    /// </summary>
    public LineStyle cls { get; set; }

    /// <summary> 分支条件 </summary>
    public List<DataCompare> Compares { get; set; }
    /// <summary>
    /// 连线比较
    /// </summary>
    /// <param name="frmDataJson"></param>
    /// <returns></returns>
    public bool Compare(JObject frmDataJson)
    {
        bool result = true;
        foreach (var compare in Compares)
        {
            compare.FieldName = compare.FieldName.ToLower();
            compare.Value = compare.Value.ToLower();
            decimal value=0;  //参考值
            decimal frmvalue=0; //表单中填写的值
            if (compare.Operation!= DataCompare.Equal&& compare.Operation != DataCompare.NotEqual)
            {
                value = decimal.Parse(compare.Value);
                frmvalue = decimal.Parse(frmDataJson.GetValue(compare.FieldName.ToLower()).ToString()); //表单中填写的值
            }
            bool res = false;
				if (compare.Condition=="and")
				{
                switch (compare.Operation)
                {
                    case DataCompare.Equal:
                        result &= compare.Value == frmDataJson.GetValue(compare.FieldName).ToString();
                        break;
                    case DataCompare.NotEqual:
                        result &= compare.Value != frmDataJson.GetValue(compare.FieldName).ToString();
                        break;
                    case DataCompare.Larger:
                        result &= frmvalue > value;
                        break;
                    case DataCompare.Less:
                        result &= frmvalue < value;
                        break;
                    case DataCompare.LargerEqual:
                        result &= frmvalue <= value;
                        break;
                    case DataCompare.LessEqual:
                        result &= frmvalue <= value;
                        break;
                    case DataCompare.In:
                        if (compare.FieldName == "申请人" || compare.FieldName == "所属部门")
                        {
                            var arr = compare.Value.Split(',');
                            foreach (var item in frmDataJson.GetValue(compare.FieldName).ToString().Split(','))
                            {
                                if (arr.Contains(item))
                                {
                                    res = true;
                                    break;
                                }
                            }
                            result &= res;
                            break;
                        }
                        else
                        {
                            var arr = compare.Value.Split(',');
                            if (arr.Contains(frmvalue.ToString()))
                            {
                                res = true;
                                break;
                            }
                            result &= res;
                            break;
                        }
                    case DataCompare.NotIn:
                        if (compare.FieldName == "申请人" || compare.FieldName == "所属部门")
                        {
                            var arr = compare.Value.Split(',');
                            foreach (var item in frmDataJson.GetValue(compare.FieldName).ToString().Split(','))
                            {
                                if (arr.Contains(item))
                                {
                                    res = false;
                                    break;
                                }
                            }
                            result &= res;
                            break;
                        }
                        else
                        {
                            var arr = compare.Value.Split(',');
                            if (arr.Contains(frmvalue.ToString()))
                            {
                                res = false;
                                break;
                            }
                            result &= res;
                            break;
                        }
                }
            }
				else
				{
                switch (compare.Operation)
                {
                    case DataCompare.Equal:
                        if (compare.FieldName == "申请人" || compare.FieldName == "所属部门")
                        {
                            var arr = compare.Value.Split(',');
                            foreach (var item in frmDataJson.GetValue(compare.FieldName).ToString().Split(','))
                            {
                                if (arr.Contains(item))
                                {
                                    res = true;
                                    break;
                                }
                            }
                            result |=  res;
                            break;
                        }
                        result |= compare.Value == frmDataJson.GetValue(compare.FieldName).ToString();
                        break;
                    case DataCompare.NotEqual:
                        if (compare.FieldName == "申请人" || compare.FieldName == "所属部门")
                        {
                            var arr = compare.Value.Split(',');
                            foreach (var item in frmDataJson.GetValue(compare.FieldName).ToString().Split(','))
                            {
                                if (arr.Contains(item))
                                {
                                    res = false;
                                    break;
                                }
                            }
                            result |= res;
                            break;
                        }
                        result |= compare.Value != frmDataJson.GetValue(compare.FieldName).ToString();
                        break;
                    case DataCompare.Larger:
                        result |= frmvalue > value;
                        break;
                    case DataCompare.Less:
                        result |= frmvalue < value;
                        break;
                    case DataCompare.LargerEqual:
                        result |= frmvalue <= value;
                        break;
                    case DataCompare.LessEqual:
                        result |= frmvalue <= value;
                        break;
                    case DataCompare.In:
                        if (compare.FieldName == "申请人" || compare.FieldName == "所属部门")
                        {
                            var arr = compare.Value.Split(',');
                            foreach (var item in frmDataJson.GetValue(compare.FieldName).ToString().Split(','))
                            {
                                if (arr.Contains(item))
                                {
                                    res = true;
                                    break;
                                }
                            }
                            result |= res;
                            break;
                        }
                        else
                        {
                            var arr = compare.Value.Split(',');
                            if (arr.Contains(frmvalue.ToString()))
                            {
                                res = true;
                            }
                            result |= res;
                            break;
                        }
                    case DataCompare.NotIn:
                        if (compare.FieldName == "申请人" || compare.FieldName == "所属部门")
                        {
                            var arr = compare.Value.Split(',');
                            foreach (var item in frmDataJson.GetValue(compare.FieldName).ToString().Split(','))
                            {
                                if (arr.Contains(item))
                                {
                                    res = false;
                                    break;
                                }
                            }
                            result |= res;
                            break;
                        }
                        else
                        {
                            var arr = compare.Value.Split(',');
                            if (arr.Contains(frmvalue.ToString()))
                            {
                                res = false;
                            }
                            result |= res;
                            break;
                        }
                }
            }
        }

        return result;
    }
}

/// <summary>
///  分支条件
/// </summary>
public class DataCompare
{
    public const string Larger = ">";
    public const string Less = "<";
    public const string LargerEqual = ">=";
    public const string LessEqual = "<=";
    public const string NotEqual = "!=";
    public const string Equal = "=";
    public const string In = "in";
    public const string NotIn = "not in";

    /// <summary>操作类型比如大于/等于/小于</summary>
    public string Operation { get; set; }

    /// <summary> form种的字段名称 </summary>
    public string FieldName { get; set; }

    /// <summary> 字段类型："form"：为表单中的字段，后期扩展系统表等. </summary>
    public string FieldType { get; set; }

    /// <summary>实际的值</summary>
    public string Value { get; set; }
    /// <summary>
    /// 实际值的显示值
    /// </summary>
    public string ValueName { get; set; }
    /// <summary>
    /// 显示值
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 条件关系
    /// </summary>
    public string Condition { get; set; }
}
/// <summary>
/// 连接样式
/// </summary>
public class LineStyle
{
    /// <summary>
    /// 连接类型
    /// </summary>
    public string linkType { get; set; }
    /// <summary>
    /// 连接颜色
    /// </summary>
    public string linkColor { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public int linkThickness { get; set; }
}
